package com.baosight.risk.service.system.impl;

import com.baosight.risk.api.system.ISysCoderuleService;
import com.baosight.risk.base.mapper.BaseMapper;
import com.baosight.risk.base.service.BaseServiceImpl;
import com.baosight.risk.common.utils.StringUtils;
import com.baosight.risk.mapper.system.SysCoderuleMapper;
import com.baosight.risk.service.system.entity.SysCoderule;
import net.sf.json.JSONArray;
import org.springframework.beans.factory.annotation.Autowired;
import com.baosight.risk.common.utils.DateUtils;
import org.springframework.stereotype.Service;

import java.util.*;


/**
 * 类 名: SysCoderuleServiceImpl
 * 描 述: 单据编码生成实现类
 * 作 者: 黎秋荣
 * 创 建：2019年04月15日
 * 版 本：v2.2.0
 * 历 史: (版本) 作者 时间 注释
 */
@Service
public class SysCoderuleServiceImpl extends BaseServiceImpl<SysCoderule> implements ISysCoderuleService {

    @Autowired
    private SysCoderuleMapper coderuleMapper;

    @Override
    public BaseMapper getMapper() {
        return coderuleMapper;
    }

    /**
     * 根据编号规则ID生成流水编号
     *
     * @param enCode 编号规则ID
     * @return 流水编号
     */
    @Override
    public String generateCodeById(String enCode) {
        SysCoderule coderule = coderuleMapper.selectCoderuleByEnCode(enCode);
        //todo:根据编码去redis拿到规则和流水号的格式、当前值和步长，
        if (StringUtils.isEmpty(coderule.getRuleFormatJson())) {
            return null;
        }
        StringBuffer data = new StringBuffer();
        List<Map<String, String>> list = JSONArray.fromObject(coderule.getRuleFormatJson());
        list.forEach((Map<String, String> map) -> {
            if (map.get("prefix").equals("日期")) {
                //日期
                data.append(DateUtils.format(new Date(), map.get("format")));
            } else if (map.get("prefix").equals("流水号")) {
                //流水号
                //生成流水号
                Integer step = serialNumber(coderule.getCurrentNumber(), map);
                data.append(String.format("%0" + map.get("format").length() + "d", step));
            } else {
                //自定义
                data.append(map.get("format"));
            }
        });
        coderuleMapper.updateNumberById(enCode, data.toString());
        return data.toString();
    }

    /**
     * 拼接编号规则中的流水号
     *
     * @param currentNumber 最大流水号
     * @param map           流水号规则
     * @return 流水号
     */
    public Integer serialNumber(String currentNumber, Map<String, String> map) {
        Integer step;
        //如果最大流水号为空，则为第一个规则编号，即初始编号；如果不为空，递增
        if (StringUtils.isEmpty(currentNumber)) {
            //如果初始值不为空，加初始值，如果为空，加1
            if (StringUtils.isEmpty(map.get("initial"))) {
                step = Integer.valueOf(map.get("format")) + 1;
            } else {
                step = Integer.valueOf(map.get("format")) + Integer.valueOf(map.get("initial"));
            }
        } else {
            Integer len = map.get("format").length();
            String number = currentNumber.substring(currentNumber.length() - len);
            //如果步长不为空，加步长，如果为空，加1
            if (StringUtils.isEmpty(map.get("step"))) {
                step = Integer.valueOf(number) + 1;
            } else {
                step = Integer.valueOf(number) + Integer.valueOf(map.get("step"));
            }
        }
        return step;
    }

    /**
     * 查询编号规则
     *
     * @param coderule 编号规则
     * @return 编号规则
     */
    @Override
    public List<SysCoderule> selectCoderule(SysCoderule coderule) {
        return coderuleMapper.selectCoderule(coderule);
    }

    /**
     * 根据ids查询编号规则
     *
     * @param ids 编号规则ID
     * @return 编号规则集合
     */
    @Override
    public List<String> getSysCoderuleByIds(List<String> ids) {
        return coderuleMapper.getSysCoderuleByIds(ids);
    }

    /**
     * 根据ids删除编号规则
     *
     * @param ids 编号规则ID
     * @return 编号规则集合
     */
    @Override
    public Integer deleteByIds(List<String> ids) {
        return coderuleMapper.deleteByIds(ids);
    }


}
